package com.xiaohe66.web.domain.sys.sec.service;

import com.xiaohe66.common.ex.BusinessException;
import com.xiaohe66.common.value.ErrorCodeEnum;
import com.xiaohe66.common.web.sec.ICurrentAccount;
import com.xiaohe66.common.web.sec.ISecurityService;
import com.xiaohe66.web.domain.account.value.AccountId;
import com.xiaohe66.web.domain.sys.sec.entity.CurrentAccount;

/**
 * @author xiaohe
 * @since 2021.10.28 16:15
 */
public interface SecurityService extends ISecurityService {

    void login(CurrentAccount currentAccount);

    @Override
    default void login(ICurrentAccount iCurrentAccount) {
        throw new UnsupportedOperationException();
    }

    void setCurrentAccount(CurrentAccount account);

    @Override
    default void setCurrentAccount(ICurrentAccount iCurrentAccount) {
        throw new UnsupportedOperationException();
    }

    @Override
    CurrentAccount getCurrentAccount();

    @Override
    AccountId getCurrentAccountId();

    /**
     * 是否有创建人权限（检查当前用户是否为指定值，管理员默认拥有全部权限）
     *
     * @param createId 创建人
     * @return 若当前用户为管理员，则返回 true，否则返回 currentAccountId.equals(createId)
     */
    boolean hasCurrentAccountPermission(AccountId createId);

    /**
     * 检查是否有创建人权限（检查当前用户是否为指定值，管理员默认拥有全部权限）
     */
    default void checkCurrentAccountPermission(AccountId createId) {
        if (!this.hasCurrentAccountPermission(createId)) {
            throw new BusinessException(ErrorCodeEnum.NOT_DATA_PERMISSION);
        }
    }

    String createToken(CurrentAccount currentAccount);

    CurrentAccount verifyTokenAndGet(String token);

}
